﻿using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Shapes;

namespace Shapes
{
    public partial class Form1 : Form
    {
        //fields
        Graphics graphic;
        Brush brush, clearBrush;
        Pen pen, clearPen;
        Color color;
        Figure current;
        TwoWayList listFigure;
        private System.Windows.Forms.MainMenu mainMenu1;
        private System.Windows.Forms.ImageList imageList1;
        private System.Windows.Forms.ToolBar toolBar1;
        private System.Windows.Forms.MenuItem menuItem1;
        // аналогичные определения для других элементов меню
        private System.Windows.Forms.MenuItem menuItem35;
        private System.Windows.Forms.ToolBarButton
            toolBarButton1;
        // аналогичные определения для других командных кнопок
        private System.Windows.Forms.ToolBarButton
            toolBarButton18;
        private System.ComponentModel.IContainer components;
        public Form1()
        {
            InitializeComponent();
            InitFields();
        }
        void InitFields()
        {
            graphic = CreateGraphics();
            color = SystemColors.ControlText;
            brush = new SolidBrush(color);
            clearBrush = new SolidBrush(SystemColors.Control);
            pen = new Pen(color);
            clearPen = new Pen(SystemColors.Control);
            listFigure = new TwoWayList();
            current = new Person(20, 50, 50);
        }
        		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}
		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			// Код, инициализирующий компоненты и построенный
			// дизайнером, опущен
		}
		#endregion
		/// <summary>
		/// Точка входа в приложение - процедура Main, 
		/// запускающая форму
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}
		private void menuItem7_Click(object sender, 
			System.EventArgs e)
		{
			createEllipse();
		}
		void createEllipse()
		{
			//clear old figure
			if (current != null) current.Show(graphic, 
				clearPen, clearBrush);
			//create ellipse
			current = new Ellipse(50, 30, 180,180);
		}
		private void menuItem8_Click(object sender, 
			System.EventArgs e)
		{
			createCircle();
		}
		void createCircle()
		{
			//clear old figure
			if (current != null) current.Show(graphic, 
				clearPen, clearBrush);
			//create circle
			current = new Circle(30, 180,180);
		}
		private void menuItem9_Click(object sender, 
			System.EventArgs e)
		{
			createLittleCircle();
		}
		void createLittleCircle()
		{
			//clear old figure
			if (current != null) current.Show(graphic, 
				clearPen, clearBrush);
			//create littlecircle
			current = new LittleCircle(180,180);
		}
		private void menuItem10_Click(object sender, 
			System.EventArgs e)
		{
			createRectangle();
		}
		void createRectangle()
		{
			//clear old figure
			if (current != null) current.Show(graphic, 
				clearPen, clearBrush);
			//create rectangle
			current = new Rect(50, 30, 180,180);
		}
		private void menuItem11_Click(object sender, 
			System.EventArgs e)
		{
			createSquare();
		}
		void createSquare()
		{
			//clear old figure
			if (current != null) current.Show(graphic, 
				clearPen, clearBrush);
			//create square
			current = new Square(30, 180,180);
		}
		private void menuItem12_Click(object sender, 
			System.EventArgs e)
		{
			createPerson();
		}
		void createPerson()
		{
			//clear old figure
			if (current != null) current.Show(graphic, 
				clearPen, clearBrush);
			//create person
			current = new Person(20, 180,180);
		}
		private void menuItem13_Click(object sender, 
			System.EventArgs e)
		{
			showCurrent();
		}
		void showCurrent()
		{
			//Show current
			current.Show(graphic, pen, brush);
		}
		private void menuItem14_Click(object sender, 
			System.EventArgs e)
		{
			clearCurrent();
		}
		void clearCurrent()
		{
			//Clear current
			current.Show(graphic, clearPen, clearBrush);
		}
		private void menuItem17_Click(object sender, 
			System.EventArgs e)
		{
			incScale();
		}
		void incScale()
		{
			//Increase scale
			current.Show(graphic, clearPen, clearBrush);
			current.Scale(1.5);
			current.Show(graphic, pen, brush);
		}
		private void menuItem18_Click(object sender, 
			System.EventArgs e)
		{
			decScale();
		}
		void decScale()
		{
			//Decrease scale
			current.Show(graphic, clearPen, clearBrush);
			current.Scale(2.0/3);
			current.Show(graphic, pen, brush);
		}
		private void menuItem19_Click(object sender, 
			System.EventArgs e)
		{
			moveLeft();
		}
		void moveLeft()
		{
			//Move left
			current.Show(graphic, clearPen, clearBrush);
			current.Move(-20,0);
			current.Show(graphic, pen, brush);
		}
		private void menuItem20_Click(object sender, 
			System.EventArgs e)
		{
			moveRight();
		}
		void moveRight()
		{
			//Move right
			current.Show(graphic, clearPen, clearBrush);
			current.Move(20,0);
			current.Show(graphic, pen, brush);
		}
		private void menuItem21_Click(object sender, 
			System.EventArgs e)
		{
			moveTop();
		}
		void moveTop()
		{
			//Move top
			current.Show(graphic, clearPen, clearBrush);
			current.Move(0,-20);
			current.Show(graphic, pen, brush);
		}
		private void menuItem22_Click(object sender, 
			System.EventArgs e)
		{
			moveDown();
		}
		void moveDown()
		{
			//Move down
			current.Show(graphic, clearPen, clearBrush);
			current.Move(0, 20);
			current.Show(graphic, pen, brush);
		}
		private void menuItem23_Click(object sender, 
			System.EventArgs e)
		{
			//choose color
			ColorDialog dialog = new ColorDialog();
			if (dialog.ShowDialog() ==DialogResult.OK) 
				color =dialog.Color;
			pen = new Pen(color); brush = 
				new SolidBrush(color); 
		}
		private void menuItem24_Click(object sender, 
			System.EventArgs e)
		{
			//Red color
			color =Color.Red;
			pen = new Pen(color); brush = 
				new SolidBrush(color); 
		}
		private void menuItem25_Click(object sender, 
			System.EventArgs e)
		{
			//Green color
			color =Color.Green;
			pen = new Pen(color); brush = 
				new SolidBrush(color); 
		}
		private void menuItem26_Click(object sender, 
			System.EventArgs e)
		{
			//Blue color
			color =Color.Blue;
			pen = new Pen(color); brush = 
				new SolidBrush(color); 
		}
		private void menuItem27_Click(object sender, 
			System.EventArgs e)
		{
			//Black color
			color =Color.Black;
			pen = new Pen(color); brush = 
				new SolidBrush(color); 
		}
		private void menuItem28_Click(object sender, 
			System.EventArgs e)
		{
			//Gold color
			color =Color.Gold;
			pen = new Pen(color); brush = 
				new SolidBrush(color); 
		}
		private void menuItem29_Click(object sender, 
			System.EventArgs e)
		{
			//put_left: добавление фигуры в список
			listFigure.put_left(current);
		}
		private void menuItem30_Click(object sender, 
			System.EventArgs e)
		{
			//put_right: добавление фигуры в список
			listFigure.put_right(current);
		}
		private void menuItem31_Click(object sender, 
			System.EventArgs e)
		{
			//remove: удаление фигуры из списка
			if(!listFigure.empty())
				listFigure.remove();
		}
		private void menuItem32_Click(object sender, 
			System.EventArgs e)
		{
			goPrev();
		}
		void goPrev()
		{
			//go_prev: передвинуть курсор влево
			if(!(listFigure.Index == 1))
			{
				listFigure.go_prev();
				current = listFigure.item();
			}
		}
		private void menuItem33_Click(object sender, 
			System.EventArgs e)
		{
			goNext();
		}
		void goNext()
		{
			//go_next: передвинуть курсор вправо
			if( !(listFigure.Index == listFigure.Count))
			{
				listFigure.go_next();
				current = listFigure.item();
			}
		}
		private void menuItem34_Click(object sender, 
			System.EventArgs e)
		{
			//go_first
			listFigure.start();
			if(!listFigure.empty())
				current = listFigure.item();
		}
		private void menuItem35_Click(object sender, 
			System.EventArgs e)
		{
			//go_last
			listFigure.finish();
			if(!listFigure.empty())
				current = listFigure.item();
		}
		private void menuItem15_Click(object sender, 
			System.EventArgs e)
		{
			showList();
		}
		void showList()
		{
			//Show List
			listFigure.start();
			while(listFigure.Index <= listFigure.Count)
			{
				current = listFigure.item();
				current.Show(graphic,pen,brush);
				listFigure.go_next();
			}
			listFigure.finish();
		}
		private void menuItem16_Click(object sender, 
			System.EventArgs e)
		{
			clearList();
		}
		void clearList()
		{
			//Clear List
			listFigure.start();
			while(!listFigure.empty())
			{
				current = listFigure.item();
				current.Show(graphic,clearPen,clearBrush);
				listFigure.remove();
			}
		}
		private void Form1_MouseMove(object sender, 
			System.Windows.Forms.MouseEventArgs e)
		{
			if((current != null) && current.dragged_figure)
			{
				current.Show(graphic,clearPen,clearBrush);
				Point pt = new Point(e.X, e.Y);
				current.center_figure = pt;
				current.Show(graphic,pen,brush);
			}
		}
		private void Form1_MouseUp(object sender, 
			System.Windows.Forms.MouseEventArgs e)
		{
			current.dragged_figure = false;
		}
		private void Form1_MouseDown(object sender, 
			System.Windows.Forms.MouseEventArgs e)
		{
			Point mousePoint = new Point (e.X, e.Y);
			Rectangle figureRect = current.Region_Capture();
			if ((current != null) && 
				(figureRect.Contains(mousePoint)))
				current.dragged_figure = true;
		}
		protected override void 
			OnPaint(System.Windows.Forms.PaintEventArgs e)
		{
			//show current figure
			current.Show(graphic, pen, brush);
		}
		private void toolBar1_ButtonClick(object sender, 
			System.Windows.Forms.ToolBarButtonClickEventArgs e)
		{
			int buttonNumber = 
				toolBar1.Buttons.IndexOf(e.Button); 
			switch (buttonNumber)
			{
				case 0:
					createEllipse(); break;
				case 1:
					createCircle(); break;
				case 2:
					createLittleCircle(); break;
				case 3:
					createRectangle(); break;
				case 4:
					createSquare(); break;
				case 5:
					createPerson();  break;
				case 6:
					showCurrent(); break;
				case 7:
					clearCurrent(); break;
				case 8:
					showList();  break;
				case 9:
					clearList();  break;
				case 10:
					incScale();  break;
				case 11:
					decScale();  break;
				case 12:
					moveLeft();  break;
				case 13:
					moveRight();  break;
				case 14:
					moveTop();  break;
				case 15:
					moveDown();  break;
				case 16:
					goNext();  break;
				case 17:
					goPrev();  break;
			}
		}
	}
    }
}
